package com.eian.boot.common.core.enums;

import java.util.Arrays;
import java.util.Objects;

/**
 * 基础枚举接口
 * 所有业务枚举应实现此接口以保证统一的枚举规范
 *
 * @param <T> 枚举值类型
 * @author alex.meng
 * @createTime 2025-10-14
 */
public interface IBaseEnum<T> {

    /**
     * 根据值获取枚举实例（通用方法）
     *
     * @param enumClass 枚举类
     * @param value     枚举值
     * @param <E>       枚举类型
     * @param <T>       值类型
     * @return 枚举实例，未找到返回null
     */
    static <E extends Enum<E> & IBaseEnum<T>, T> E getByValue(Class<E> enumClass, T value) {
        if (enumClass == null || value == null) {
            return null;
        }
        return Arrays.stream(enumClass.getEnumConstants())
                .filter(e -> Objects.equals(value, e.getValue()))
                .findFirst()
                .orElse(null);
    }

    /**
     * 根据标签获取枚举实例（通用方法）
     *
     * @param enumClass 枚举类
     * @param label     枚举标签
     * @param <E>       枚举类型
     * @param <T>       值类型
     * @return 枚举实例，未找到返回null
     */
    static <E extends Enum<E> & IBaseEnum<T>, T> E getByLabel(Class<E> enumClass, String label) {
        if (enumClass == null || label == null) {
            return null;
        }
        return Arrays.stream(enumClass.getEnumConstants())
                .filter(e -> Objects.equals(label, e.getLabel()))
                .findFirst()
                .orElse(null);
    }

    /**
     * 获取枚举值（用于数据库存储）
     *
     * @return 枚举值
     */
    T getValue();

    /**
     * 获取枚举标签（用于显示）
     *
     * @return 枚举标签
     */
    String getLabel();

    /**
     * 获取枚举描述
     *
     * @return 枚举描述
     */
    default String getDescription() {
        return getLabel();
    }
}

